package com.xayy.health.mgt.controller;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.kawins.base.result.CheckResult;
import cn.kawins.base.result.ResultBody;
import cn.kawins.mybatis.base.BaseController;
import com.xayy.health.core.enums.TaskStatusEnum;
import com.xayy.health.mgt.mapper.CalculateDataMapper;
import com.xayy.health.mgt.model.FaultScoreConfig;
import com.xayy.health.mgt.model.TaskChildInfo;
import com.xayy.health.mgt.model.TaskInfo;
import com.xayy.health.mgt.model.dto.ChildTaskDto;
import com.xayy.health.mgt.model.dto.TaskInfoDto;
import com.xayy.health.mgt.service.DownloadImagesService;
import com.xayy.health.mgt.service.TaskChildInfoService;
import com.xayy.health.mgt.service.TaskInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author Nie
 * @version V1.0
 * @date 2023/4/24 14:09
 */
@RestController
@RequestMapping(value = "/task1")
@Api(tags = "任务列表")
public class TaskInfoController extends BaseController<TaskInfo> {

    @Autowired
    private TaskInfoService taskInfoService;
    @Autowired
    private CalculateDataMapper calculateDataMapper;
    @Autowired
    private TaskChildInfoService taskChildInfoService;

    @Autowired
    private DownloadImagesService downloadImagesService;

    /**
     * 自动运行任务列表-保存
     *
     * @param taskInfoDto 自动运行任务
     * @return ResultBody
     */
    @PostMapping("/save")
    @ApiOperation(value = "保存配置", httpMethod = "POST", response = CheckResult.class, notes = "自动运行任务列表-保存")
    public ResultBody save( TaskInfoDto taskInfoDto) {
        return taskInfoService.saveTaskInfo(taskInfoDto).body();
    }

    /**
     * 自动运行任务列表分页(数据处理，趋势预测，事后诊断)
     *
     * @param taskInfoDto 任务入参
     * @return ResultBody
     */
    @ApiOperation(value = "自动运行任务列表分页(数据处理，趋势预测，事后诊断)")
    @PostMapping("taskPageList")
    public ResultBody taskPageList(@RequestBody TaskInfoDto taskInfoDto) {
        return ResultBody.success(taskInfoService.pageList(taskInfoDto));
    }

    /**
     * 自动运行子任务列表分页(数据处理，趋势预测，事后诊断)
     *
     * @param childTaskDto 子任务入参
     * @return ResultBody
     */
    @ApiOperation(value = "自动运行子任务列表分页(数据处理，趋势预测，事后诊断)")
    @PostMapping("getChildTaskPageList")
    public ResultBody getChildTask(@RequestBody ChildTaskDto childTaskDto) {
        return ResultBody.success(taskInfoService.getChildTaskPageList(childTaskDto));
    }

    /**
     * 任务子列表
     *
     * @param taskId 子任务id
     * @return ResultBody
     */
    @ApiOperation(value = "任务子列表")
    @GetMapping("getChildTask/{taskId}")
    public ResultBody getChildTask(@PathVariable Long taskId) {
        List<TaskChildInfo> taskChildInfos = taskChildInfoService.select(TaskChildInfo.builder().taskId(taskId).build());
        taskChildInfos.forEach(x -> x.setStatusName(TaskStatusEnum.valueof(x.getStatus())));
        return ResultBody.success(taskChildInfos);
    }


    /**
     * 启动/停止任务状态
     *
     * @param taskInfo 任务对象
     * @return ResultBody
     */
    @ApiOperation(value = "启动/停止任务状态")
    @PostMapping("stopChildThread")
    public ResultBody stopChildThread(@RequestBody TaskInfo taskInfo) {
        return ResultBody.success(taskChildInfoService.updateStatusData(taskInfo));
    }

    /**
     * 更新任务列表
     *
     * @param taskInfo 任务对象
     * @return ResultBody
     */
    @ApiOperation(value = "更新任务列表")
    @PostMapping("updateCalculateTaskList")
    public ResultBody updateCalculateTaskList(@RequestBody TaskInfo taskInfo) {
        calculateDataMapper.deleteDataList(taskInfo);
        DateTime nextStartTime = DateUtil.offsetSecond(taskInfo.getStartTime(), Integer.parseInt(taskInfo.getStep()) * 60);
        taskInfo.setStartTime(nextStartTime);
        //根据任务开始时间计算出任务结束时间并更新
        DateTime endTime = null;
        if (3 == taskInfo.getType()) {
            //趋势预测
            endTime = DateUtil.offsetMinute(taskInfo.getStartTime(), Integer.parseInt(taskInfo.getCycle()));

        } else {
            endTime = DateUtil.offsetHour(taskInfo.getStartTime(), Integer.parseInt(taskInfo.getCycle()));
        }

        taskInfo.setEndTime(endTime);
        taskInfoService.updateByIdSelective(taskInfo);
        return ResultBody.success("更新成功");
    }

    /**
     * 根据任务id查询任务数据
     *
     * @param taskId 任务id
     * @return ResultBody
     */
    @ApiOperation(value = "根据任务id查询任务数据")
    @GetMapping("selectTaskInfo/{taskId}")
    public ResultBody selectTaskInfo(@PathVariable(value = "taskId") @ApiParam("任务id") Long taskId) {
        return ResultBody.success(taskInfoService.selectTaskInfo(taskId));
    }


    /**
     * 获取数据处理批量预处理所有任务
     * @return ResultBody
     */
    @ApiOperation(value = "获取数据处理批量预处理所有下载图片任务")
    @GetMapping("downloadImagesTask")
    public ResultBody downloadImagesServiceImpl() {
        return ResultBody.success(downloadImagesService.taskList());
    }

    /**
     * 查看版本号(每次发布前更改)
     */
    @ApiOperation(value = "查看版本号")
    @GetMapping("version")
    public ResultBody getVersion() {
        return ResultBody.success("当前版本v1.0-202401121237");
    }
}
